from abc import ABCMeta, abstractmethod

# ABCMeta是定义抽象基类的元素
# 此时A是抽象基类，只能用于继承，不会创建实际的对象


class A(metaclass=ABCMeta):
    # abstractmethod 把被装饰的方法声明为抽象的方法， 用于重写或继承
    @abstractmethod
    def B(self):
        print("我是大B")
    @abstractmethod
    def C(self):
        print("我是大C")


class b(A):
    def B(self):
        print("我是小b")

    def C(self):
        print("小b的C")


class c(A):
    def B(self):
        print("我是小c")

    def C(self):
        print("小c的C")


class F(c, A):
    def B(self):
        print("我是f")


# f_F = F()
# f_F.B()
# f_F.C()

# 定义对外提供的工厂类


class FClass(object):
    # 定义对外提供的工厂方法
    def make_sound(self, object_type):
        return eval(object_type)().B()
    # 定义对外提供的工厂方法

    def make_C(self, object_type):
        print("object_type", object_type)
        print("转换后的类型是》》", eval(object_type))
        return eval(object_type)().C()


f = FClass()
name = input("请输入b或c")
f.make_C(name)  # 对外提供的方法，如返回我是大B， 不对外公开
f.make_sound(name)
